home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / AMICUS / AMICUS25.ADF / DiskWipe / diskwipe.c < prev    next >
C/C++ Source or Header  |  1989-01-26  |  11KB  |  445 lines

  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
  2. * |_o_o|\\ Copyright (c) 1987 The Software Distillery.  All Rights Reserved *
  3. * |. o.| ||          Written by Doug Walker                                 *
  4. * | .  | ||          The Software Distillery                                *
  5. * | o  | ||          235 Trillingham Lane                                   *
  6. * |  . |//           Cary, NC 27513                                         *
  7. * ======             BBS:(919)-471-6436                                     *
  8. \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  9.  
  10. #define EXTERN
  11.  
  12. #include "mydebug.h"
  13. #include "diskwipe.h"
  14.  
  15. #define MSG_COPYRIGHT 0
  16. #define MSG_DESTROY   1
  17. #define MSG_INSERT    2
  18. #define MSG_USAGE     3
  19. #define MSG_CTRLBK    4
  20. #define MSG_KEEP      5
  21. #define MSG_USE       6
  22.  
  23. #define MSG_SYS       7
  24. #define MSG_NOMEM     7
  25. #define MSGGETSERR    8
  26. #define MSG_WPROT     8
  27. #define MSG_NODISK    9
  28. #define MSG_BADUNIT  10
  29. #define MSG_INUSE     7
  30. #define MSG_DISKERR  12
  31.  
  32. char globlen[] =
  33. {
  34.    58, 59, 50, 56, 21, 15, 20, 12, 24, 17, 14, 16,
  35. #ifdef MYDEBUG
  36.    26
  37. #endif
  38. };
  39.  
  40. char *globmsg[] =
  41. {
  42.    "DISKWIPE 1.0 - Copyright (c) 1987 The Software Distillery\n",
  43. #define DESTROY_SPOT      36
  44.    "\n***** WARNING: All data in drive DF0: will be lost! *****\n",
  45.    "Insert disk and enter new name or press RETURN to ",
  46.    "Usage: diskwipe [MANY] [[DRIVE] <dfn:>] [[NAME] <name>]\n",
  47.    "Press CTRL-\\ to quit\n",
  48.    "keep old name: ",
  49.    "use specified name: ",
  50.    "Fatal error\n",
  51.    "Disk is write protected\n",
  52.    "No disk in drive\n",
  53.    "No such drive\n",
  54.    "Drive in use\n",
  55. #ifdef MYDEBUG
  56. #define DISKERR_SPOT 22
  57.    "Trackdisk error, code    \n"
  58. #endif
  59.    };
  60.  
  61. void inhibit(arg1)
  62. LONG arg1;
  63. {
  64.    BUG(1, ("inhibit: Entry\n"))
  65.    g.msg->mn_ReplyPort = g.packet->dp_Port = g.replyport;
  66.    g.msg->mn_Node.ln_Name = (char *)g.packet;
  67.    g.msg->mn_Node.ln_Type = NT_MESSAGE;
  68. /*   msg->mn_Length =  0; */
  69.  
  70.    g.packet->dp_Link = g.msg;
  71.    g.packet->dp_Type = ACTION_INHIBIT;
  72.    g.packet->dp_Arg1 = arg1;
  73.    PutMsg(g.dosport, g.msg);
  74.    WaitPort(g.replyport); 
  75.    (void)GetMsg(g.replyport);
  76.    BUG(1, ("inhibit: Exit, res1 %ld res2 %ld\n", g.packet->dp_Res1, g.packet->dp_Res2))
  77. }
  78.  
  79. void iopanic()
  80. {
  81. #ifdef MYDEBUG
  82.    short code;
  83. #endif
  84.    register int iomsg;
  85. BUG(1, ("iopanic: Entry, io_Error = %d\n", TDREQ(io_Error)))
  86.    switch(TDREQ(io_Error))
  87.    {
  88.       case TDERR_WriteProt:    iomsg = MSG_WPROT;   break;  /* 28 */
  89.       case TDERR_DiskChanged:  iomsg = MSG_NODISK;  break;  /* 29 */
  90.       case TDERR_BadUnitNum:                                /* 32 */
  91.       case TDERR_BadDriveType: iomsg = MSG_BADUNIT; break;  /* 33 */
  92.       case TDERR_DriveInUse:   iomsg = MSG_INUSE;   break;  /* 34 */
  93.       default:
  94. #ifdef MYDEBUG
  95.          code = (TDREQ(io_Error)) & 255;
  96. BUG(100, ("iopanic: code is %d\n", (unsigned int)code))
  97.          globmsg[MSG_DISKERR][DISKERR_SPOT] = '0' + (short)(code/(short)100);
  98.          code %= (short)100;
  99. BUG(100, ("iopanic: code is %d\n", (unsigned int)code))
  100.          globmsg[MSG_DISKERR][DISKERR_SPOT+1] = '0' + (short)(code/(short)10);
  101.          code %= (short)10;
  102. BUG(100, ("iopanic: code is %d\n", (unsigned int)code))
  103.          globmsg[MSG_DISKERR][DISKERR_SPOT+2] = '0' + code;
  104.          iomsg = MSG_DISKERR;
  105.          break;
  106. #else
  107.      iomsg = MSG_SYS;
  108. #endif
  109.    }
  110.    panic(iomsg);
  111. }
  112.  
  113. void panic(msgnum)
  114. int msgnum;
  115. {
  116.    BUG(1, ("panic: Entry\n"))
  117.    g.errnum++;
  118.  
  119.    if(msgnum>=MSGGETSERR) Write(g.outfile, "ERROR: ", 7L);
  120.    PUTTERM(msgnum);
  121.  
  122.    enditall();
  123. }
  124.  
  125. void GetName(diskname)
  126. char *diskname;
  127. {
  128.    int i;
  129.    char *tmpchar;
  130. BUG(1, ("GetName: Entry\n"))
  131. #ifdef NOTDOS
  132.    if(!(g.flags & DW_NOTDOS))
  133.    {
  134. #endif
  135.       TDREQ(io_Length) = MYIOSIZE;
  136.       TDIO(CMD_READ);
  137. BUG(100, ("Getname: TDIO done\n"))
  138.       tmpchar = (char *)(TDREQ(io_Data));
  139.       if(tmpchar[3] != 2 || tmpchar[511] != 1) goto DEFNAME;
  140.       memcpy(diskname, tmpchar+433, i=min(30, (int)tmpchar[432]));
  141.       diskname[i] = '\0';
  142. BUG(100, ("GetName: %d chars in name\n", i))
  143. BUG(1, ("GetName: Exit, name is '%s'\n", diskname))
  144.       return;
  145. #ifdef NOTDOS
  146.    }
  147. #endif
  148.  
  149. DEFNAME:
  150. BUG(10, ("GetName: Root block not initialized, using default\n"))
  151.          strcpy(diskname, "Dos disk");
  152. BUG(1, ("GetName: Exit, name is '%s'\n", diskname))
  153. }
  154.  
  155. long checksum(block)
  156. long *block;
  157. {
  158.    long sum;
  159.    int i;
  160.  
  161.    for(i=0, sum = 0L; i<128; i++) sum += block[i];
  162.  
  163.    BUG(100, ("checksum: returning %ld\n", -sum))
  164.    return(-sum);
  165. }
  166.  
  167. void makeroot(buffer, diskname)
  168. long *buffer;
  169. char *diskname;
  170. {
  171.    int i;
  172.    memset((char *)buffer, 0, TD_SECTOR);
  173.    buffer[0]   = 2L;   /* Type                        */
  174.    buffer[3]   = 72L;  /* Hashtable size              */
  175.    buffer[79]  = 881L; /* Block to contain the bitmap */
  176.    *(((char *)buffer)+432) = i = strlen(diskname);
  177.    memcpy(((char *)buffer)+433, diskname, i);
  178.    DateStamp(buffer+121);  /* Volume creation date      */
  179.    DateStamp(buffer+105);  /* Volume last modified date */
  180.    buffer[127] = 1L;       /* Secondary type for root   */
  181.    buffer[5] = checksum(buffer);
  182. }
  183.  
  184. void DosTerm()
  185. {
  186. BUG(1, ("DosTerm: enter\n"))
  187.    if(g.replyport)
  188.    {
  189. BUG(10, ("DosTerm: Disposing of replyport\n"))
  190.       inhibit(0L);
  191.       DisposePort(g.replyport);
  192.       g.replyport = (struct MsgPort *)NULL;
  193.    }
  194.    if(g.msg)    FreeMem((char *)g.msg, sizeof(struct Message));
  195.    if(g.packet) FreeMem((char *)g.packet, sizeof(struct DosPacket));
  196.    g.msg = (struct Message *)(g.packet = (struct DosPacket *)NULL);
  197. BUG(1, ("DosTerm: exit    \n"))
  198. }
  199.  
  200. void DosInit(device)
  201. int device;
  202. {
  203.    char devname[5];
  204. BUG(1, ("DosInit: Entry\n"))
  205.  
  206.    strcpy(devname, "df0:");
  207.    devname[2] = '0' + device;
  208.  
  209.    if( !(g.msg = (struct Message *)AllocMem(sizeof(struct Message), 
  210.                                   MEMF_PUBLIC|MEMF_CLEAR))      ||
  211.        !(g.packet = (struct DosPacket *)AllocMem(sizeof(struct DosPacket), 
  212.                              MEMF_PUBLIC|MEMF_CLEAR)) ||
  213.        !(g.replyport = NewPort())
  214.      )
  215.       panic(MSG_NOMEM);
  216.  
  217.    g.dosport = (struct MsgPort *)DeviceProc(devname);
  218.    inhibit(1);
  219. }
  220.  
  221. void enditall()
  222. {
  223. BUG(1, ("Enditall: Entry\n"))
  224.    TDTerm();
  225. BUG(100, ("Enditall: TDTerm done\n"))
  226.    DosTerm();
  227. BUG(100, ("Enditall: DosTerm done\n"))
  228.    Write(g.outfile, "\n", 1);
  229.    XCEXIT(0);
  230. }
  231.  
  232. void testbreak()
  233. {
  234.    if (SetSignal(0,0) & (SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D))
  235.    {
  236.       Write(g.outfile, "***Break", 8);
  237.       enditall();
  238.    }
  239. }
  240. void main(argc, argv)
  241. int argc;
  242. char *argv[];
  243. {
  244.    char diskname[31];
  245.    char *tmpchar, *usename;
  246.    int nameflag, nexttok, i;
  247.  
  248. #ifdef MYDEBUG
  249.    int j;
  250.    for(i=0; i<MAXDEBUG; i++) debug[i] = 0;
  251. #endif
  252.  
  253.    if(argc == 0) XCEXIT(5);
  254.  
  255.    memset((char *)&g, 0, sizeof(struct MYGLOBAL));
  256.  
  257. #ifdef MYDEBUG
  258.    if(argc>1 && argv[1][0] == '-' && toupper(argv[1][1]) == 'D')
  259.    {
  260.       if(argv[1][2] == '*') i = -1;
  261.       else (void)stcd_i(argv[1]+2, &i);
  262.       if(i >= MAXDEBUG) i = 0;
  263.       (void)stcd_i(argv[2], &j);
  264.       if(i>= 0)
  265.       {
  266.          debug[i] = j;
  267.          printf("Debugging group %d initialized at level %d\n",i,j);
  268.       }
  269.       else
  270.       {
  271.          for(i=0; i<MAXDEBUG; i++) debug[i] = j;
  272.          printf("All debugging initialized at level %d\n", j);
  273.       }
  274.       argc-=2, argv+=2;
  275.    }
  276. #endif
  277.    BUG(1, ("main: Entry\n"))
  278.  
  279.    g.outfile = Output();
  280.  
  281.    usename = diskname;
  282.    nameflag = FALSE;
  283.    for(nexttok=0; argc > 1; argc--, argv++)
  284.    {
  285.       if(argv[1][0] == '?')
  286.       {
  287.          PUTTERM(MSG_COPYRIGHT);
  288.          panic(MSG_USAGE);
  289.       }
  290.       else if(!nexttok && !stricmp(argv[1], "MANY"))
  291.          g.flags |= DW_MANY;
  292. #ifdef NOTDOS
  293.       else if(!nexttok && !stricmp(argv[1], "NOTDOS"))
  294.          g.flags |= DW_NOTDOS;
  295. #endif
  296.       else if(nexttok == 1 || (!nexttok && 
  297.            (toupper(argv[1][0]) == 'D' && toupper(argv[1][1]) == 'F' &&
  298.             (i = argv[1][2] - '0')>=0 && i < 4
  299.           )))
  300.       {
  301.          g.tdunit = i;
  302.          nexttok = 0;
  303.       }
  304.       else if(!nexttok && !stricmp(argv[1], "DRIVE"))
  305.          nexttok = 1;
  306.       else if(!nexttok && !stricmp(argv[1], "NAME"))
  307.          nexttok = 2;
  308.       else if(!nameflag)
  309.       {
  310.          usename = argv[1];
  311.          nameflag = TRUE;
  312.          nexttok = 0;
  313.       }
  314.       else
  315.          panic(MSG_USAGE);
  316.    }
  317.  
  318.    TDInit();
  319.  
  320.    DosInit(g.tdunit);
  321.  
  322.    if(!(TDREQ(io_Data) = (APTR)AllocMem(MYIOSIZE, MEMF_CHIP|MEMF_CLEAR)))
  323.       panic(MSG_NOMEM);
  324.  
  325.    globmsg[MSG_DESTROY][DESTROY_SPOT] = '0' + g.tdunit;
  326.    PUTTERM(MSG_DESTROY)
  327.    if(g.flags & DW_MANY) PUTTERM(MSG_CTRLBK)
  328.  
  329.    diskname[30] = '\0';
  330.    do
  331.    {
  332.       TDMotOff();
  333.       PUTTERM(MSG_INSERT)
  334.       PUTTERM(nameflag ? MSG_USE : MSG_KEEP)
  335.       if(!Read(Input(), diskname, 30)) break;
  336.       testbreak();
  337.       if(diskname[0] != '\n' && (tmpchar=strchr(diskname, '\n')) )
  338.       {
  339.          *tmpchar = '\0';
  340.          usename = diskname;
  341.          nameflag = FALSE;
  342.       }
  343.       else if(!nameflag)
  344.          GetName(diskname);
  345.  
  346.       TDREQ(io_Length)  = MYIOSIZE;
  347.  
  348. #ifdef NOTDOS
  349.       if(g.flags & DW_NOTDOS)
  350.       {
  351.          strcpy((char *)TDREQ(io_Data), "DOS");
  352.          TDREQ(io_Offset) = 0;
  353.          TDIO(CMD_WRITE);
  354.          TDREQ(io_Offset) = 880*TD_SECTOR;
  355.       }
  356. #endif
  357.  
  358.       makeroot((long *)TDREQ(io_Data), usename);
  359.       TDIO(CMD_WRITE);
  360.    }
  361.    while(g.flags & DW_MANY);
  362.  
  363.    enditall();   
  364. }
  365.  
  366. void TDIO(command)
  367. UWORD command;
  368. {
  369.    BUG(1, ("TDIO: Entry, command %d\n", command))
  370.    TDREQ(io_Command) = command;
  371.    DoIO((struct IORequest *)g.diskreq);
  372.    if(TDREQ(io_Error)) iopanic();
  373.    BUG(1, ("TDIO: Exit\n"))
  374. }
  375.  
  376. void TDInit()
  377. {
  378.    BUG(1, ("TDInit: Entry\n"))
  379.  
  380.    if(!(g.diskport = NewPort()) || !(g.diskreq = CreateIOExtTD(g.diskport)))
  381.       panic(MSG_SYS);
  382.  
  383.    ETDREQ(iotd_Count) = (unsigned long)0xffffffff;
  384.    TDREQ(io_Offset) = 880*TD_SECTOR;
  385.  
  386.    BUG(10, ("TDInit: Port created, diskreq allocated\n"))
  387.  
  388.    if(OpenDevice(TD_NAME, g.tdunit, (struct IORequest *)g.diskreq, 0))
  389.       iopanic();
  390.  
  391.    g.flags |= DW_TDOPEN;
  392.  
  393.    BUG(1, ("TDInit: Exit\n"))
  394. }
  395.  
  396. void TDTerm()
  397. {
  398.    BUG(1, ("TDTerm: Entry\n"))
  399.  
  400.    if(g.flags & DW_TDOPEN)
  401.    {
  402.       if(TDREQ(io_Data))
  403.       {
  404. BUG(100, ("Enditall: freeing io_Data\n"))
  405.          FreeMem((char *)TDREQ(io_Data), MYIOSIZE);
  406.          TDREQ(io_Data) = NULL;
  407.       }
  408.       if(g.errnum<2) TDMotOff();
  409.  
  410.       CloseDevice((struct IORequest *)g.diskreq);
  411. BUG(10, ("TDTerm: Device closed\n"))
  412.  
  413.       DeleteIOExtTD(g.diskreq);
  414. BUG(10, ("TDTerm: Diskreq freed\n"))
  415.  
  416.       g.diskreq = (struct IOExtTD *)NULL;
  417.    }
  418.  
  419.    if(g.diskport)
  420.    {
  421.       DisposePort(g.diskport);
  422.       g.diskport = (struct MsgPort *)NULL;
  423. BUG(10, ("TDTerm: port deleted\n"))
  424.    }
  425.  
  426. BUG(1, ("TDTerm: Exit\n"))
  427. }
  428.  
  429. void TDMotOff()
  430. {
  431. BUG(1, ("TDMotOff: Entry\n"))
  432.    TDREQ(io_Length) = 0;
  433.    if(!TDREQ(io_Error))
  434.    {
  435. BUG(10, ("TDMotOff: Clearing track buffer\n"))
  436.       TDIO((UWORD)ETD_UPDATE);
  437.       TDIO((UWORD)ETD_CLEAR);
  438.    }
  439.  
  440.    TDIO((UWORD)ETD_MOTOR);
  441. BUG(1, ("TDMotOff: Exit\n"))
  442. }
  443.  
  444. void MemCleanup(){}
  445.